home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_03 / 1103054a < prev    next >
Text File  |  1993-01-04  |  17KB  |  452 lines

  1. #include "windows.h"
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. //******************************************************************
  6. //Title:        3D.C
  7. //Author:       Thomas W. Olsen
  8. //Version:      1.0
  9. //Compiler:     Microsoft C/C++ 7.0
  10. //              rc /r 3d.rc
  11. //              cl /c /AL /Gsw /W3 /Oas /Zpe /Zi /FPi 3d.c
  12. //              link /CO /NOD 3d,,, libw llibcew win87em, 3d.def
  13. //              rc 3d.exe
  14. //******************************************************************
  15.  
  16. //*********************** Various Constants ************************
  17.  
  18. #define CENTER              0
  19. #define PI                  3.141593
  20. #define RADIANS(a)          (a * (PI / 180.0))
  21. #define DEGREES(a)          (a * (180.0 / PI))
  22. #define NO_OF_VERTICES      66
  23. #define NO_OF_SURFACES      45
  24. #define NO_OF_SURFACE_VERTICES 220
  25. #define VIEW_RATIO      (40 / 10)
  26. #define MIN_DEGREES          0
  27. #define MAX_DEGREES        359
  28. #define ROTATE_DEGREES       5
  29.  
  30. //********************* Structure Definitions **********************
  31.  
  32. typedef struct tagPOINT3D
  33. {
  34.     double x;
  35.     double y;
  36.     double z;
  37. } POINT3D;
  38.  
  39. typedef struct tagVERTEX
  40. {
  41.     POINT3D world;                      // World Coordinates
  42.     POINT3D eye;                        // Eye Coordinates
  43.     POINT   screen;                     // Screen Coordinates
  44. } VERTEX;
  45.  
  46. typedef struct tagSURFACE
  47. {
  48.     int mapIndex;                       // Index Into the Surface Map Array
  49.     int noOfVertices;                   // No of Vertices Forming the Surface
  50.     int depthIndex;                     // Used in Determining Depth of Surface
  51.     int brushColor;
  52. } SURFACE;
  53.  
  54. typedef struct tagOBJECT
  55. {
  56.     VERTEX  vertex[NO_OF_VERTICES];
  57.     SURFACE info[NO_OF_SURFACES];
  58.     int     map[NO_OF_SURFACE_VERTICES];
  59. } OBJECT;
  60.  
  61. //************************** Static Data ***************************
  62.  
  63. OBJECT f16 = 
  64. {   
  65.     {   // Vertex Array
  66.         {  0.00,  0.00, 0.00 },                             //Center
  67.         { 0.00, -17.00, 9.00 }, {  0.00, -13.00, 9.00 },    //Tail
  68.         { 0.00, -14.50, 3.00 }, { 0.00, -8.00,  3.00 },
  69.         { 0.00, -14.50,  2.00 }, { 0.00, -5.00,  2.00 },
  70.         { -0.50, -16.00,  1.00 }, { -1.00, -16.00,  0.00 }, //Exhaust
  71.         { -0.50, -16.00, -0.50 }, { 0.00, -16.00, -1.00 },
  72.         { 0.50, -16.00, -0.50 }, { 1.00, -16.00,  0.00 },
  73.         { 0.50, -16.00,  1.00 },
  74.         { -1.00, -13.00,  2.00 }, { -2.00, -13.00,  0.00 }, //Fuse
  75.         { -1.50, -13.00, -1.50 }, { 0.00, -13.00, -2.00 },
  76.         { 1.50, -13.00, -1.50 }, { 2.00, -13.00,  0.00 },
  77.         { 1.00, -13.00,  2.00 }, { -1.00,  7.00,  2.00 },
  78.         { -2.00,  7.00,  0.00 }, { -1.50,  7.00, -1.50 },
  79.         { 0.00,  7.00, -2.00 },  { 1.50,  7.00, -1.50 },
  80.         { 2.00,  7.00,  0.00 }, { 1.00,  7.00,  2.00 },
  81.         { 2.00, -8.00,  0.00 }, { 11.00, -8.00,  0.00 },    //Wings
  82.         { 11.00, -5.00,  0.00 }, { 5.00,  0.00,  0.00 },
  83.         { 2.00,  7.00,  0.00 }, { -2.00, -8.00,  0.00 },
  84.         { -11.00, -8.00,  0.00 }, { -11.00, -5.00,  0.00 },
  85.         { -5.00,  0.00,  0.00 }, { -2.00,  7.00,  0.00 },
  86.         { 0.50,  2.00,  2.00 }, { -0.50,  2.00,  2.00 },    //Cockpit
  87.         { 1.00,  5.00,  2.00 }, { 0.50,  5.00,  3.50 },
  88.         { -0.50,  5.00,  3.50 }, { -1.00,  5.00,  2.00 },
  89.         { 1.00,  8.00,  2.00 }, { 0.50,  8.00,  3.50 },
  90.         { -0.50,  8.00,  3.50 }, { -1.00,  8.00,  2.00 },
  91.         { 0.50, 11.00,  2.00 }, { -0.50, 11.00,  2.00 },
  92.         { 0.00,  7.00, -1.00 }, { -1.00, 11.00,  2.00 },    //Subfuse
  93.         { -2.00, 11.00,  0.00 }, { 0.00, 11.00, -1.00 },
  94.         { 2.00, 11.00,  0.00 }, { 1.00, 11.00,  2.00 },
  95.         { 0.00, 11.00, -1.00 }, { 0.00, 17.00,  0.00 },     //Nose
  96.         { -2.00, -16.00, 0.00 }, { -8.00, -16.00,  0.00 },  //Elevators
  97.         { -8.00, -14.00,  0.00 }, { -2.00, -10.00, 0.00 },
  98.         { 2.00, -16.00, 0.00 }, { 8.00, -16.00, 0.00 },
  99.         { 8.00, -14.00, 0.00 }, { 2.00, -10.00, 0.00 }
  100.     },
  101.     {   // Surface Info ... (Points to Surface Map)
  102.         { 0,  5, 60,  DKGRAY_BRUSH }, { 5,  5, 64,  DKGRAY_BRUSH }, //Elevators
  103.         { 10, 5, 60,  DKGRAY_BRUSH }, { 15, 5, 64,  DKGRAY_BRUSH },
  104.         { 20, 5,  1,  GRAY_BRUSH },   { 25, 5,  4,  LTGRAY_BRUSH },   //Tail
  105.         { 30, 5,  1,  GRAY_BRUSH },   { 35, 5,  4,  LTGRAY_BRUSH },
  106.         { 40, 5, 14,  BLACK_BRUSH },  { 45, 5, 15,  DKGRAY_BRUSH },   //Exhaust
  107.         { 50, 5, 16,  BLACK_BRUSH },  { 55, 5, 17,  BLACK_BRUSH },
  108.         { 60, 5, 18,  DKGRAY_BRUSH }, { 65, 5, 19,  BLACK_BRUSH },
  109.         { 70, 5,  20, DKGRAY_BRUSH },
  110.         { 75, 5,  22, DKGRAY_BRUSH }, { 80, 5,  23, GRAY_BRUSH },   //Fuse
  111.         { 85, 5,  24, DKGRAY_BRUSH }, { 90, 5,  25, DKGRAY_BRUSH },
  112.         { 95, 5,  26, GRAY_BRUSH },   { 100, 5, 27, DKGRAY_BRUSH },
  113.         { 105, 5, 20, GRAY_BRUSH, },
  114.         { 110, 6, 30, DKGRAY_BRUSH }, { 116, 6, 35, DKGRAY_BRUSH }, //Wings
  115.         { 122, 6, 30, DKGRAY_BRUSH }, { 128, 6, 35, DKGRAY_BRUSH },
  116.         { 134, 5, 21, LTGRAY_BRUSH }, { 139, 5, 22, LTGRAY_BRUSH }, //Subfuse
  117.         { 144, 5, 50, LTGRAY_BRUSH }, { 149, 5, 26, LTGRAY_BRUSH },
  118.         { 154, 5, 27, LTGRAY_BRUSH },
  119.         { 159, 4, 55, GRAY_BRUSH },   { 163, 4, 54, GRAY_BRUSH },   //Nose
  120.         { 167, 4, 56, GRAY_BRUSH },   { 171, 4, 52, GRAY_BRUSH },
  121.         { 175, 4, 51, LTGRAY_BRUSH },
  122.         { 179, 5, 41, WHITE_BRUSH },  { 184, 5, 45, WHITE_BRUSH },   //Cockpit
  123.         { 189, 5, 46, WHITE_BRUSH },  { 194, 4, 41, WHITE_BRUSH },
  124.         { 198, 4, 42, WHITE_BRUSH },  { 202, 5, 41, WHITE_BRUSH },
  125.         { 207, 5, 46, WHITE_BRUSH },  { 212, 4, 45, WHITE_BRUSH },
  126.         { 216, 4, 46, WHITE_BRUSH }
  127.     },
  128.     {   // Surface Map ... (Points to Vertex Array)
  129.         58, 61, 60, 59, 58, 62, 63, 64, 65, 62, 58, 59, 60, 61, 58, // Elevators
  130.         62, 65, 64, 63, 62,
  131.          1,  3,  4,  2,  1, 3,  5,  6,  4,  3, 1,  2,  4,  3,  1,   // Tail
  132.          3,  4,  6,  5,  3,
  133.         14, 15,  8,  7, 14, 15, 16,  9,  8, 15, 16, 17, 10,  9, 16, // Exhaust
  134.         17, 18, 11, 10, 17, 18, 19, 12, 11, 18, 19, 20, 13, 12, 19,
  135.         20, 14,  7, 13, 20,
  136.         14, 21, 22, 15, 14, 15, 22, 23, 16, 15, 16, 23, 24, 17, 16, // Fuse
  137.         17, 24, 25, 18, 17, 18, 25, 26, 19, 18, 19, 26, 27, 20, 19,
  138.         20, 27, 21, 14, 20,
  139.         28, 29, 30, 31, 32, 28, 33, 37, 36, 35, 34, 33, 28, 32, 31, // Wings
  140.         30, 29, 28, 33, 34, 35, 36, 37, 33,
  141.         21, 51, 52, 22, 21, 22, 52, 53, 50, 22, 50, 53, 54, 26, 50, // Subfuse
  142.         26, 54, 55, 27, 26, 27, 55, 51, 21, 27,
  143.         55, 54, 57, 55, 54, 56, 57, 54, 56, 52, 57, 56, 52, 51, 57, 52, // Nose
  144.         51, 55, 57, 51,
  145.         41, 42, 39, 38, 41, 45, 46, 42, 41, 45, 48, 49, 46, 45, 48, // Cockpit
  146.         40, 41, 38, 40, 42, 43, 39, 42, 44, 45, 41, 40, 44,
  147.         46, 47, 43, 42, 46, 48, 45, 44, 48, 49, 47, 46, 49
  148.     }
  149. };
  150.  
  151. BOOL wireFrame = FALSE;
  152. double distance = 75, thetaDegrees = 90, phiDegrees = 60;
  153.  
  154. //************************** Static Data ***************************
  155.  
  156. LONG FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  157. void DrawObject(HWND hWnd, HDC hDC, OBJECT *object );
  158. int __cdecl compareProc( const void *elem1, const void *elem2 );
  159.  
  160. //************************** Program Begin *************************
  161.  
  162. int PASCAL WinMain(HANDLE hInst, HANDLE hPrevInst, LPSTR lpCmdLine, int numCmdShow )
  163. {
  164.     MSG       msg;
  165.     HWND      hWnd;
  166.     WNDCLASS  wc;
  167.  
  168.     //************************* Setup Window ************************
  169.  
  170.     wc.style         = (UINT) NULL;
  171.     wc.lpfnWndProc   = WindowProc;
  172.     wc.cbClsExtra    = 0;
  173.     wc.cbWndExtra    = 0;
  174.     wc.hInstance     = hInst;
  175.     wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION);
  176.     wc.hCursor       = LoadCursor( NULL, IDC_ARROW);
  177.     wc.hbrBackground = GetStockObject(BLACK_BRUSH);
  178.     wc.lpszMenuName  = (LPSTR) "Menu";
  179.     wc.lpszClassName = (LPSTR) "3DClass";
  180.  
  181.     if (!RegisterClass(&wc))
  182.         return(FALSE);
  183.  
  184.     hWnd = CreateWindow( "3DClass", "3D Modeling Example",
  185.                           WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
  186.                           CW_U